package br.com.consultsystems.persistencia.impl.cadastro;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.consultsystems.dominio.cadastro.Pessoa;
import br.com.consultsystems.persistencia.spec.AbstractAdministradoraRepository;
import br.com.consultsystems.persistencia.spec.cadastro.PessoaPersistencia;

@Stateless(name = "pessoaPersistencia")
public class PessoaPersistenciaImpl extends
		AbstractAdministradoraRepository<Pessoa> implements
		PessoaPersistencia {

	protected PessoaPersistenciaImpl() {
		super(Pessoa.class);
	}

	@Override
	public List<Pessoa> retrieveByFilter(String nome) throws Exception {
		
		final EntityManager em = getEntityManager();
		final CriteriaBuilder criteriaBuilder = createCriteriaBuilder();
		final CriteriaQuery<Pessoa> criteriaQuery = createCriteriaQuery(criteriaBuilder);
		final Root<Pessoa> root = createRoot(criteriaQuery);

		/* Repository -> Apenas pesquias as informações no banco de dados
		 * Filtro por codigo */

		final Path<String> pathNome = root.get("nome");
		final Predicate predicateNome = criteriaBuilder.like(pathNome, "%"+nome+"%");
		criteriaQuery.where(predicateNome);
		criteriaQuery.orderBy(criteriaBuilder.asc(pathNome));
		
		final TypedQuery<Pessoa> typedQuery = em.createQuery(criteriaQuery);
		
		return typedQuery.getResultList();
	}

}
